package ar.edu.utn.frba.dds.aterrizar.usuarios;

import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frba.dds.aterrizar.aerolineas.*;
import ar.edu.utn.frba.dds.aterrizar.busquedas.*;

public class Usuario {
	private  HomeUsuarios centroDeUsuarios = HomeUsuarios.getInstance();
	private TipoDeUsuario tipoDeUsuario;
	private String nombre;
	private String apellido;
	private String DNI;
	private float TotalPrecioDeCompras = 0;
	private String password;
	private ArrayList<Busqueda> busquedasRealizadas = new ArrayList<Busqueda>();
	
	public Usuario(String unNombre, TipoDeUsuario unTipo, String unApellido, String unDNI) {
		this.setApellido(unApellido);
		this.setNombre(unNombre);
		this.setTipoDeUsuario(unTipo);
		this.setDNI(unDNI);
		this.centroDeUsuarios.getUsuariosRegistrados().add(this);
	}

	public float getTotalPrecioDeCompras() {
		return TotalPrecioDeCompras;
	}
	
	public TipoDeUsuario getTipoDeUsuario() {
		return tipoDeUsuario;
	}

	public void setTipoDeUsuario(TipoDeUsuario tipoDeUsuario) {
		this.tipoDeUsuario = tipoDeUsuario;
	}
	
	public int getRecargo() {
		return this.getTipoDeUsuario().getRecargo();
	}
	
	public	ArrayList<Vuelo> buscarVuelos(Busqueda busqueda) {
		busquedasRealizadas.add(busqueda);
		List<Vuelo> vuelosGenerales = new ArrayList<Vuelo>();
		for(AerolineasInterface aerolinea : OperadorDeAerolineas.getAerolineas()) {
			vuelosGenerales.addAll(buscarVuelos(aerolinea, busqueda));
		}
		ArrayList<Vuelo> vuelosBuscados = new ArrayList<Vuelo>();
		for(Vuelo unVuelo: vuelosGenerales) {
			if(unVuelo.cumpleRequerimientosExtras(this, busqueda) && unVuelo.esVisiblePara(unVuelo.getAerolinea(), this)) {
				vuelosBuscados.add(unVuelo);
			}
		}
		return vuelosBuscados;
	}
	
	public	List<Vuelo> buscarVuelos(AerolineasInterface aerolinea, Busqueda busqueda) {
		ArrayList<Vuelo> asientos;
		if(busqueda.getIncluirReservados()) {
			asientos = aerolinea.getAsientosBuscadosIncluyendoReservados(busqueda);
		} else {
			asientos = aerolinea.getAsientosBuscados(busqueda);
		}
		return asientos;
	}
	 
	public	void comprarVuelo(Vuelo vuelo) {
		vuelo.getAerolinea().comprarVuelo(vuelo, this);
		this.tipoDeUsuario.registrarCompra(this, vuelo.getPrecioPara(this));
	}

	public	void reservarVuelo(Vuelo vuelo) {
		vuelo.getAerolinea().reservarVuelo(vuelo, this);
	}
	
	public void actualizarCompras(float unMonto) {
		TotalPrecioDeCompras += unMonto; 
	}
	
	public boolean getActitudSuperoferta() {
		return this.getTipoDeUsuario().getActitudSupeoferta();
	}

	public String getDNI() {
		
		return this.DNI;
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public void setDNI(String dni) {
		DNI = dni;
	}
	
	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
}
